#!/usr/bin/env python
# -*- coding: utf-8 -*-

##
# Módulos del sistema
from sqlobject import * # Ver cómo solucionamos esto.
from connection import connection

# Establesco la conexion
sqlhub.processConnection = connection

class EmpleadoBD(SQLObject):
    """Tabla Empleado.

    Detalle del uso del mismo
    """
    _connection = connection
    nombre = UnicodeCol(notNone=True, length=30)
    apellido = UnicodeCol(notNone=True, length=30)
    legajo = UnicodeCol(notNone=True,
            unique=True,
            length=5,
            alternateID=True)#unique=True,
    e_mail = UnicodeCol(default = "")
    telefono_interno = UnicodeCol(default="", length=30)
    telefono_externo = UnicodeCol(default="", length=30)
    direcciones = MultipleJoin("DireccionBD", joinColumn="empleado_id") #1:n
    historial_de_estado = MultipleJoin("HistorialDeEstadoBD",
            joinColumn="empleado_id") #0:n
    usuarios = MultipleJoin("UsuarioBD", joinColumn='empleado_id')
    tickets_reclamados = MultipleJoin("TicketBD", joinColumn="empleado_id")

class DireccionBD(SQLObject):
    """Tabla Direccion.

    Detalle del uso del mismo
    """
    _connection = connection
    domicilio = UnicodeCol(notNone=True, length=30)
    numero = UnicodeCol(notNone=True, length=6)
    piso = UnicodeCol(notNone=False, length=2)
    empleado_id = ForeignKey("EmpleadoBD", cascade = True)

class UsuarioBD(SQLObject):
    """Tabla Usuario.

    Detalle del uso del mismo
    """
    _connection = connection
    u_legajo = UnicodeCol(notNone=True, unique=True, length=6)
    password = UnicodeCol(notNone=True, unique=True, length=10)
    tickets_creados = MultipleJoin("TicketBD", joinColumn="usuario_id")
    empleado_id = ForeignKey("EmpleadoBD", cascade=True)
    grupo_de_resolucion_id = ForeignKey("GrupoDeResolucionBD", cascade=True)
    observacion = MultipleJoin("ObservacionBD", joinColumn="usuario_id")

class GrupoDeResolucionBD(SQLObject):
    """Table GrupoDeResolucion.

    Detalle del uso del mismo
    """
    _connection = connection
    #codigo: Podemos tomar el id como el codigo del grupo
    estado = BoolCol(default=True)
    fecha_creacion = DateTimeCol(notNone=True)
    descripcion = UnicodeCol(notNone=True, length=300)
    nombre = UnicodeCol(notNone=True, length=100, unique=True)
    integrantes = MultipleJoin("UsuarioBD",
            joinColumn="grupo_de_resolucion_id")
    tickets_asignados = MultipleJoin("TicketBD",
            joinColumn="grupo_de_resolucion_id") #0:n
    clasificaciones = MultipleJoin("ClasificacionBD", joinColumn="grupo_id")#1:n
    observaciones = MultipleJoin("ObservacionBD",
            joinColumn="grupo_de_resolucion_id") #
    intervenciones = MultipleJoin("IntervencionesBD",
            joinColumn="grupo_de_resolucion_id")

class ClasificacionBD(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    #codigo: Podemos tomar el id como el codigo del grupo
    nombre = UnicodeCol(notNone=True, length=100, unique=True)
    estado = BoolCol(default=True)
    grupo_id = ForeignKey("GrupoDeResolucionBD", cascade=True)
    intervenciones = MultipleJoin("IntervencionBD", joinColumn="clasificacion_id")
    descripcion = UnicodeCol(default="")
    historial_de_clasificacion = ForeignKey("HistorialDeClasificacionBD",
            cascade=True)

class ObservacionBD(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    #numero_obs: Podemos tomar el id como el codigo de la Obs.
    descripcion = UnicodeCol(notNone=True)
    grupo_de_resolucion = ForeignKey("GrupoDeResolucionBD", cascade=True)
    intervencion_id = ForeignKey("IntervencionBD", cascade=True)
    usuario_id = ForeignKey("EmpleadoBD", cascade=True)
    fecha = DateTimeCol()

class IntervencionBD(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    #codigo: Podemos tomar el id como el codigo del grupo
    estado = BoolCol(default=True)
    fecha = DateTimeCol()
    observaciones = MultipleJoin("ObservacionBD", joinColumn="intervencion_id")
    clasificacion = ForeignKey("ClasificacionBD", cascade=True)
    grupo_de_resolucion = ForeignKey("GrupoDeResolucionBD", cascade=True)
    ticket_id = ForeignKey("TicketBD", cascade=True)

class HistorialDeClasificacionBD(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    #codigo: Podemos tomar el id como el codigo del historial de clasificacion
    fecha = DateTimeCol()
    clasificacion = ForeignKey("ClasificacionBD")
    ticket = ForeignKey("TicketBD")

class HistorialDeEstadoBD(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    #codigo: Podemos tomar el id como el codigo del historial de estado
    fecha = DateTimeCol()
    empleado = ForeignKey("EmpleadoBD", cascade=True)
    estados = MultipleJoin("EstadoBD", joinColumn="historial_de_estado_id")
    ticket = ForeignKey("TicketBD", cascade=True)

class EstadoBD(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    descripcion = UnicodeCol(notNone=True, length=100)
    nombre = UnicodeCol(notNone=True, length=50)
    historial_de_estado = ForeignKey("HistorialDeEstadoBD", cascade=True)

class TicketBD(SQLObject):
    """Breve explicacion del metodo/clase.

    Detalle del uso del mismo
    """
    _connection = connection
    #numero_ticket: Podemos tomar el id como el numero
    fecha_cierre = DateTimeCol()
    fecha_creacion = DateTimeCol(notNone=True)
    descripcion = UnicodeCol(notNone=True, length=300)
    grupo_de_resolucion = ForeignKey("GrupoDeResolucionBD", cascade=True)
    intervenciones = MultipleJoin("IntervencionBD", joinColumn="ticket_id")
    historial_de_estado = MultipleJoin("HistorialDeEstadoBD",
            joinColumn="ticket_id")
    historial_de_clasificacion = MultipleJoin("HistorialDeClasificacionBD",
            joinColumn="ticket_id")
    empleado_solicitante = ForeignKey("EmpleadoBD")
    usuario_creacion = ForeignKey("UsuarioBD", cascade=True)
    usuario_cierre = ForeignKey("UsuarioBD", cascade=True)
    cerrado = BoolCol(default=False)

##
# Si no existen las bases de datos las creamos.
lista = [EmpleadoBD, TicketBD, UsuarioBD, DireccionBD, GrupoDeResolucionBD,
        ClasificacionBD, ObservacionBD, IntervencionBD, HistorialDeClasificacionBD,
        HistorialDeEstadoBD, EstadoBD]
for tabla in lista:
    tabla.createTable(ifNotExists=True)

